# -*- coding:utf-8 -*-
# @FileName : app\models\user.py
# @Time     : 2025/11/28
# @Author   : 天空之城
"""用户模型文件

此模块定义用户模型，使用SQLAlchemy进行ORM映射。
"""
from werkzeug.security import generate_password_hash, check_password_hash
from app.extensions import db
from .role import Role


class User(db.Model):
    """用户模型
    
    定义用户表结构，包含用户的基本信息和权限相关字段。
    """
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 用户ID
    username = db.Column(db.String(50), unique=True, nullable=False)  # 用户名
    email = db.Column(db.String(120), unique=True, nullable=True)  # 邮箱
    password_hash = db.Column(db.String(128), nullable=False)  # 密码哈希值
    created_at = db.Column(db.DateTime, default=db.func.current_timestamp())  # 创建时间
    updated_at = db.Column(db.DateTime, default=db.func.current_timestamp(), onupdate=db.func.current_timestamp())  # 更新时间
    
    # 关联角色
    roles = db.relationship('Role', secondary='user_roles', lazy='dynamic')
    
    def __repr__(self):
        """返回用户对象的字符串表示"""
        return f'<User {self.username}>'
    
    @property
    def password(self):
        """密码属性，用于设置密码时自动生成哈希值
        
        Raises:
            AttributeError: 当尝试读取密码时抛出异常，密码不可直接读取
        """
        raise AttributeError('password is not a readable attribute')
    
    @password.setter
    def password(self, password):
        """设置密码，自动生成密码哈希值
        
        Args:
            password: 原始密码字符串
        """
        self.password_hash = generate_password_hash(password)
    
    def verify_password(self, password):
        """验证密码
        
        Args:
            password: 待验证的密码字符串
        
        Returns:
            bool: 密码验证是否通过
        """
        return check_password_hash(self.password_hash, password)
    
    def to_dict(self):
        """将用户对象转换为字典
        
        Returns:
            包含用户信息的字典
        """
        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None,
            'roles': [
                {
                    'id': role.id,
                    'name': role.name,
                    'description': role.description
                } for role in self.roles
            ]
        }
    
    def has_permission(self, permission_name):
        """检查用户是否具有指定权限
        
        Args:
            permission_name: 权限名称字符串
        
        Returns:
            bool: 用户是否具有该权限
        """
        for role in self.roles:
            if role.permissions.filter_by(name=permission_name).first():
                return True
        return False
